﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.Produccion.Compras;
using BussinessLogicTecnoPez.Tipos_Comunes;
using Tecnopez.Globals;
using Microsoft.Practices.EnterpriseLibrary.Validation;

public partial class Modules_Compras_ABMOrdenPago : System.Web.UI.Page
{
    const String pedidoViewStateOrdenKey = "ordenOrdenPago";
    const String pedidoViewStateOrdenDireccionKey = "ordenDireccionOrdenPago";
    const String detalleSession = "DetalleOP";
    //const String pedidosSession = "PedidosProv";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.Page.IsPostBack)
        {
            SetMode(PageMode.ListMode);
            CargarComboProveedor();
        }

        TPPProveedor.ObjType = typeof(Proveedor);
        TPPTipoMoneda.ObjType = typeof(TipoMoneda);

        //if (TPPProveedor.ItemSelected != null && Session[pedidosSession] == null)
        if (TPPProveedor.ItemSelected != null)
        {
            cargarGrillaPedidos();
        }

        InicializarValidadores();
        InicializarGrillas();

        cmdEliminar.OnClientClick = "return confirm('Esta seguro de anular la orden de pago?');";

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/configurar.gif";
        master.Titulo = "Gestión de Ordenes de Pago";
        cargarGrilla();
        _lblError.Text = "";
    }
    private void ClearSession()
    {
        Session[detalleSession] = null;
        //Session[pedidosSession] = null;
    }
    private void CargarComboProveedor()
    {
        ddlProveedor.DataTextField = "RazonSocial";
        ddlProveedor.DataValueField = "idProveedor";
        ddlProveedor.DataSource = Proveedor.getManager.GetAll();
        ddlProveedor.DataBind();

        ListItem item = new ListItem("Seleccione...", "-1");
        ddlProveedor.Items.Insert(0, item);
    }

    #region "Grillas"
    private void InicializarGrillas()
    {
        grdOrdenesPago.setupGrid<OrdenPago>(cargarGrilla, seleccionarPedidoProveedor, null, true, this.ViewState);
        grdOrdenesPago.PageDataViewOrdenKey = pedidoViewStateOrdenKey;
        grdOrdenesPago.PageDataViewOrdenDireccionKey = pedidoViewStateOrdenDireccionKey;
    }
    private void seleccionarPedidoProveedor(int o)
    {
        int IdOrdenPago = int.Parse(grdOrdenesPago.grdDatosAbmView.DataKeys[o].Value.ToString());
        OrdenPago.getManager.ClearFilters();
        OrdenPago.getManager.AddFilter("IDORDENPAGO", GenericManager<OrdenPago>.filterOperator.Equals, IdOrdenPago);
        OrdenPago objOrdenPago = OrdenPago.getManager.GetOne();
        txtID.Text = objOrdenPago.IdOrdenPago.ToString();
        chkAnulada.Checked = objOrdenPago.Anulada;
        TPCFechaCarga.Text = objOrdenPago.Fecha.ToShortDateString();
        TPCFechaVencimiento.Text = objOrdenPago.FechaVencimiento.ToShortDateString();

        txtTotal.Text = objOrdenPago.MontoTotal.ToString();

        if (objOrdenPago.TipoMoneda != null)
            TPPTipoMoneda.ItemSelected = objOrdenPago.TipoMoneda;
        else
            TPPTipoMoneda.ItemSelected = null;

        if (objOrdenPago.Proveedor != null)
            TPPProveedor.ItemSelected = objOrdenPago.Proveedor;
        else
            TPPProveedor.ItemSelected = null;

        if (chkAnulada.Checked)
            cmdEditar.OnClientClick = "alert('No se pueden editar ordenes de pago anuladas.'); return false;";
        else
            cmdEditar.OnClientClick = "";

        ClearSession();
        if (objOrdenPago.DetalleOrdenPago != null)
            Session[detalleSession] = objOrdenPago.DetalleOrdenPago;
        cargarGrillaPedidos();
        cargarGrillaDetalleOP();

        SetMode(PageMode.ViewMode);
    }
    private void cargarGrilla()
    {
        OrdenPago.getManager.ClearFilters();
        OrdenPago.getManager.ClearOrders();
        OrdenPago.getManager.AddFilter("IdOrdenPago", GenericManager<OrdenPago>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");

        if (ddlProveedor.SelectedValue != "-1")
            OrdenPago.getManager.AddFilter("PROVEEDOR", GenericManager<OrdenPago>.filterOperator.Equals, ddlProveedor.SelectedValue);

        if (ViewState[pedidoViewStateOrdenKey] == null)
            OrdenPago.getManager.AddOrder("IdOrdenPago", GenericManager<OrdenPago>.Order.orderDirection.DESC);
        else
            OrdenPago.getManager.AddOrder(ViewState[pedidoViewStateOrdenKey].ToString(), (GenericManager<OrdenPago>.Order.orderDirection)ViewState[pedidoViewStateOrdenDireccionKey]);

        List<OrdenPago> lista = new List<OrdenPago>();
        lista = OrdenPago.getManager.GetFilter();
        grdOrdenesPago.grdDatosAbmView.DataSource = lista;
        grdOrdenesPago.grdDatosAbmView.DataBind();
    }
    private void cargarGrillaPedidos()
    {
        if (TPPProveedor.ItemSelected == null)
        {
            grdPedidos.DataSource = null;
            grdPedidos.DataBind();
            return;
        }

        BoundField objCol;
        grdPedidos.AutoGenerateColumns = false;
        grdPedidos.Columns.Clear();

        objCol = new BoundField();
        objCol.HeaderText = "Código";
        objCol.DataField = "IdPedidoProveedor";
        grdPedidos.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.HeaderText = "Fecha";
        objCol.DataField = "FechaString";
        grdPedidos.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.HeaderText = "Moneda";
        objCol.DataField = "TipoMoneda";
        grdPedidos.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.HeaderText = "Monto";
        objCol.DataField = "Monto";
        grdPedidos.Columns.Add(objCol);

        ButtonField objColButton = new ButtonField();
        objColButton.ButtonType = ButtonType.Image;
        objColButton.CommandName = "Add";
        objColButton.HeaderText = "Agregar";
        objColButton.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/next.gif";
        grdPedidos.Columns.Add(objColButton);

        string[] strKeys = new string[1];
        strKeys[0] = "IdPedidoProveedor";
        grdPedidos.DataKeyNames = strKeys;

        Proveedor objProveedor = (Proveedor)TPPProveedor.ItemSelected;
        PedidoProveedor.getManager.ClearFilters();
        PedidoProveedor.getManager.AddFilter("Proveedor", GenericManager<PedidoProveedor>.filterOperator.Equals, objProveedor.IdProveedor);
        //los pedidos solo pueden estar en estado "pedido" (1)
        PedidoProveedor.getManager.AddFilter("TipoEstadoPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Equals, 1);

        List<PedidoProveedor> objPedidos = PedidoProveedor.getManager.GetFilter();
        grdPedidos.DataSource = objPedidos;
        grdPedidos.DataBind();
    }
    private void cargarGrillaDetalleOP()
    {
        BoundField objCol;
        grdDetalleOp.AutoGenerateColumns = false;
        grdDetalleOp.Columns.Clear();

        objCol = new BoundField();
        objCol.HeaderText = "Código";
        objCol.DataField = "IdPedidoProveedor";
        grdDetalleOp.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.HeaderText = "Fecha";
        objCol.DataField = "FechaPedidoProveedorString";
        grdDetalleOp.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.HeaderText = "Moneda";
        objCol.DataField = "MonedaPedidoProveedorString";
        grdDetalleOp.Columns.Add(objCol);

        objCol = new BoundField();
        objCol.HeaderText = "Monto";
        objCol.DataField = "MontoPedidoProveedor";
        grdDetalleOp.Columns.Add(objCol);

        ButtonField objColButton = new ButtonField();
        objColButton.ButtonType = ButtonType.Image;
        objColButton.CommandName = "DeleteRow";
        objColButton.HeaderText = "Quitar";
        objColButton.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        grdDetalleOp.Columns.Add(objColButton);

        string[] strKeys = new string[1];
        strKeys[0] = "IdPedidoProveedor";
        grdDetalleOp.DataKeyNames = strKeys;

        grdDetalleOp.DataSource = Session[detalleSession];
        grdDetalleOp.DataBind();
    }
    #endregion
    #region "Modos"
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        _lblError.Text = "";
        _lblErrorDetalle.Text = "";
        switch (mode)
        {
            case PageMode.ListMode:
                wzrABM.ActiveStepIndex = 0;
                break;
            case PageMode.NewMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                chkAnulada.Enabled = false;
                TPCFechaCarga.Enabled = true;
                TPCFechaVencimiento.Enabled = true;
                TPPProveedor.Enable = true;
                TPPTipoMoneda.Enable = true;
                txtTotal.ReadOnly = true;
                btnAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                grdDetalleOp.Enabled = true;
                grdPedidos.Enabled = true;
                break;
            case PageMode.EditMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                chkAnulada.Enabled = false;
                TPCFechaCarga.Enabled = true;
                TPCFechaVencimiento.Enabled = true;
                TPPProveedor.Enable = false;
                TPPTipoMoneda.Enable = true;
                txtTotal.ReadOnly = true;
                btnAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                grdDetalleOp.Enabled = true;
                grdPedidos.Enabled = true;
                break;
            case PageMode.ViewMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                chkAnulada.Enabled = false;
                TPCFechaCarga.Enabled = false;
                TPCFechaVencimiento.Enabled = false;
                TPPProveedor.Enable = false;
                TPPTipoMoneda.Enable = false;
                txtTotal.ReadOnly = true;
                btnAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                cmdEliminar.Enabled = true;
                grdDetalleOp.Enabled = false;
                grdPedidos.Enabled = false;
                break;
        }
    }

    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    #endregion
    #region "Validaciones"
    private void InicializarValidadores()
    {
        PPVProveedor.SourceTypeName = "BussinessLogicTecnoPez.Produccion.Compras.OrdenPago";
        PPVProveedor.ControlToValidate = "txtID";
        PPVProveedor.PropertyName = "Proveedor";
        PPVProveedor.DisplayMode = ValidationSummaryDisplayMode.List;

        PPVTipoMoneda.SourceTypeName = "BussinessLogicTecnoPez.Produccion.Compras.OrdenPago";
        PPVTipoMoneda.ControlToValidate = "txtID";
        PPVTipoMoneda.PropertyName = "TipoMoneda";
        PPVTipoMoneda.DisplayMode = ValidationSummaryDisplayMode.List;

        PPVFecha.SourceTypeName = "BussinessLogicTecnoPez.Produccion.Compras.OrdenPago";
        PPVFecha.ControlToValidate = "txtID";
        PPVFecha.PropertyName = "Fecha";
        PPVFecha.DisplayMode = ValidationSummaryDisplayMode.List;

        PPVFechaVencimiento.SourceTypeName = "BussinessLogicTecnoPez.Produccion.Compras.OrdenPago";
        PPVFechaVencimiento.ControlToValidate = "txtID";
        PPVFechaVencimiento.PropertyName = "FechaVencimiento";
        PPVFechaVencimiento.DisplayMode = ValidationSummaryDisplayMode.List;
    }
    protected void PPVProveedor_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPPProveedor.ItemSelected == null)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPPProveedor.ItemSelected.ToString();
    }
    protected void PPVFecha_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPCFechaCarga.Text == null || Convert.ToDateTime(TPCFechaCarga.Text) == DateTime.MinValue)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPCFechaCarga.Text;
    }
    protected void PPVFechaVencimiento_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPCFechaVencimiento.Text == null || Convert.ToDateTime(TPCFechaVencimiento.Text) == DateTime.MinValue)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPCFechaVencimiento.Text;
    }
    protected void PPVTipoMoneda_ValueConvert(object sender, Microsoft.Practices.EnterpriseLibrary.Validation.Integration.AspNet.ValueConvertEventArgs e)
    {
        if (TPPTipoMoneda.ItemSelected == null)
            e.ConvertedValue = null;
        else
            e.ConvertedValue = TPPTipoMoneda.ItemSelected.ToString();
    }
    private bool validar(OrdenPago objeto)
    {
        ValidationResults v = Validation.Validate<OrdenPago>(objeto);
        if (!v.IsValid)
        {
            _lblError.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        if (TPCFechaCarga.Text != null && TPCFechaCarga.Text != string.Empty
            && TPCFechaVencimiento.Text != null && TPCFechaVencimiento.Text != string.Empty)
        {
            if (Convert.ToDateTime(TPCFechaCarga.Text) > Convert.ToDateTime(TPCFechaVencimiento.Text))
            {
                _lblError.Text = "La fecha de carga no puede ser menor a la fecha de vencimiento";
                return false;
            }
        }
        return v.IsValid;
    }

    private bool validarItemDetalle(ItemDetalleOrdenPago objeto)
    {
        ValidationResults v = Validation.Validate<ItemDetalleOrdenPago>(objeto);
        if (!v.IsValid)
        {
            _lblErrorDetalle.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        return v.IsValid;
    }
    #endregion
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        //en realidad anula una orden de pago
        try
        {
            OrdenPago objOrdenPago;
            OrdenPago.getManager.ClearFilters();
            OrdenPago.getManager.AddFilter("IdOrdenPago", GenericManager<OrdenPago>.filterOperator.Equals, txtID.Text);
            objOrdenPago = OrdenPago.getManager.GetOne();

            objOrdenPago.Anulada = true;
            if (!OrdenPago.getManager.Update(objOrdenPago))
            {
                _lblError.Text = OrdenPago.getManager.GeneratedException.Message;
            }
            else
            {
                SetMode(PageMode.ListMode);
                cargarGrilla();
            }
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            OrdenPago objOrdenPago = new OrdenPago();
            objOrdenPago.Anulada = chkAnulada.Checked;
            objOrdenPago.Fecha = Convert.ToDateTime(TPCFechaCarga.Text);
            objOrdenPago.FechaVencimiento = Convert.ToDateTime(TPCFechaVencimiento.Text);
            objOrdenPago.MontoTotal = decimal.Parse(txtTotal.Text);
            objOrdenPago.TipoMoneda = TPPTipoMoneda.ItemSelected as TipoMoneda;
            objOrdenPago.Proveedor = TPPProveedor.ItemSelected as Proveedor;
            objOrdenPago.DetalleOrdenPago = Session[detalleSession] as DetalleOrdenPago;            

            if (validar(objOrdenPago))
            {
                objOrdenPago.SetStatePedidos();
                if (getMode() == PageMode.NewMode)
                {
                    if (OrdenPago.getManager.Insert(objOrdenPago) != true)
                    {
                        throw OrdenPago.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ListMode);
                    cargarGrilla();
                }
                else
                {
                    objOrdenPago.IdOrdenPago = int.Parse(txtID.Text.Trim());
                    if (OrdenPago.getManager.Update(objOrdenPago) != true)
                    {
                        throw OrdenPago.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ViewMode);
                }
                _lblError.Text = "";
                _lblErrorDetalle.Text = "";
            }            
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        chkAnulada.Checked = false;        

        txtID.Text = "";
        txtTotal.Text = "0";
        TPPTipoMoneda.ItemSelected = Functions.getMonedaDefault();
        TPPProveedor.ItemSelected = null;

        ClearSession();
        cargarGrillaDetalleOP();
        cargarGrillaPedidos();

        TPCFechaCarga.Text = DateTime.Today.ToShortDateString();
        TPCFechaVencimiento.Text = DateTime.Today.Add(new TimeSpan(7, 0, 0, 0)).ToShortDateString();

        SetMode(PageMode.NewMode);
    }
    protected void grdPedidos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Add")
        {
            DetalleOrdenPago objDetalle = (DetalleOrdenPago)Session[detalleSession];
            try
            {
                PedidoProveedor.getManager.ClearFilters();
                PedidoProveedor.getManager.AddFilter("IdPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Equals, grdPedidos.Rows[int.Parse(e.CommandArgument.ToString())].Cells[0].Text);
                PedidoProveedor objPedido = PedidoProveedor.getManager.GetOne();

                if (objDetalle == null)
                {
                    objDetalle = new DetalleOrdenPago();
                }
                objDetalle.add(objPedido, objPedido.Monto);                
            }
            catch (Exception ex)
            {
                _lblErrorDetalle.Text = ex.Message;
            }
            finally
            {
                Session[detalleSession] = objDetalle;
                cargarGrillaDetalleOP();
                CalcularTotal();
            }
        }
    }

    private void CalcularTotal()
    {
        DetalleOrdenPago objDetalle = (DetalleOrdenPago)Session[detalleSession];
        if (objDetalle == null)
        {
            txtTotal.Text = "0";
            return;
        }
        decimal decTotal = 0;
        foreach (ItemDetalleOrdenPago objItem in objDetalle)
        {
            decTotal += objItem.Monto;
        }
        txtTotal.Text = decTotal.ToString();
    }
    protected void grdDetalleOp_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteRow")
        {
            DetalleOrdenPago objDetalle = (DetalleOrdenPago)Session[detalleSession];
            DetalleOrdenPago objNewDetalle = new DetalleOrdenPago();
            try
            {
                PedidoProveedor.getManager.AddFilter("IdPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Equals, grdPedidos.Rows[int.Parse(e.CommandArgument.ToString())].Cells[0].Text);

                if (objDetalle == null)
                    return;

                foreach (ItemDetalleOrdenPago objItem in objDetalle.ItemList)
                {
                    if (objItem.IdPedidoProveedor != int.Parse(grdDetalleOp.Rows[int.Parse(e.CommandArgument.ToString())].Cells[0].Text))
                    {
                        objNewDetalle.add(objItem);
                    }
                }
                Session[detalleSession] = objNewDetalle;
            }
            catch (Exception ex)
            {
                _lblErrorDetalle.Text = ex.Message;
            }
            finally
            {                
                cargarGrillaDetalleOP();
                CalcularTotal();
            }
        }
    }
}